package com.cloud.proxy.filter;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;

/**
 * PRE过滤器之日志记录
 *
 * TIPS: 路由功能负责将请求转发到具体的微服务实例上，而过滤器功能则是对请求的处理过程进行干预
 *
 * @author qinxh
 * @date 2016/10/31
 */
@Component
public class RequestLogFilter extends ZuulFilter {

    private static Logger logger = LoggerFactory.getLogger(RequestLogFilter.class);

    /**
     * @return String
     */
    @Override
    public String filterType() {

        // 设置为 PRE 过滤器
        return FilterConstants.PRE_TYPE;
    }

    /**
     * Filter执行顺序，通过数字指定。数字越大，优先级越低
     *
     * @return int
     */
    @Override
    public int filterOrder() {

        return 1;
    }

    /**
     *
     * @return boolean
     */
    @Override
    public boolean shouldFilter() {

        return Boolean.TRUE;
    }

    /**
     * Filter具体实现逻辑
     *
     *  TIPS: 不依赖于Eureka的服务路由方式不能被拦截
     * @return
     */
    @Override
    public Object run() {

        // 过滤器之间没有直接的交互，而是通过一个RequestContext静态类来进行数据传递。
        // TIPS: RequestContext类中用ThreadLocal变量来记录每个Request所需要传递的数据
        RequestContext currentContext = RequestContext.getCurrentContext();
        logger.info("请求URI信息{}", currentContext.getRequest().getRequestURI());

        return null;
    }
}
